package com.hh.config;

import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * @author 辉辉 2022/8/16 22:34
 */
@Configuration
public class RedisCacheConfig {
    //使用了 cache 的注解，需要手动设置序列化
    private CacheProperties cacheProperties;

    /*** 该配置类被构造时，它里面的参数，将有 Spring 的 ioc 容器提供 ** @param cacheProperties */
    public RedisCacheConfig(CacheProperties cacheProperties) {
        this.cacheProperties = cacheProperties;
    }

    /*** 定义 Redis 缓存的序列化的形式 *
     * 在这个 RedisSerializer 类里面提交了 3 种常用的序列化形式 *
     * 1 java jdk 的序列化 (默认的形式) *
     * 2 json jackson （我们可以手动切换） *
     * 3 String String 的序列化(主要用在字符串的存储，不是对象)
     * 对 key 一般使用的是 String 的序列化*/
    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {
        CacheProperties.Redis redisProperties = this.cacheProperties.getRedis();
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        config = config.serializeValuesWith(
                RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));
        // 缓存的过期时间，一般我们在配置文件里面设置
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        // 空值的缓存
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        //禁用 key
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }
        return config;
    }
}